生一個小孩要九個月,找九個女人來也不會變成一個月。
Fred Brooks 在《人月神話》裡用過這個比方。他在 IBM 主持 OS/360 的開發,專案落後時,他做了最直覺的決定:加人。結果專案更晚交付。這個教訓後來被稱為 Brooks 定律 — 替已經延遲的軟體專案加人,只會讓它更晚。
原因有兩個。有些工作本質上是循序的,拆不開。而每多一個人,溝通的路徑就多一條:三個人之間有三條溝通線,十個人之間有四十五條。新人要花時間進入狀況,老人要花時間解釋背景,對齊的成本最後吃掉多出來的人力。
五十年後,AI coding agent 可以在幾秒內生出一個幫手。招募和培訓的成本幾乎歸零,但 Brooks 講的那兩個限制還在,只是換了位置。
Claude Code 可以把一件事交給另一個 agent 處理,大致有兩種做法。
subagent 是從零開始的新 agent。它看不到主對話前面發生過什麼,只拿到一份任務說明,加上 CLAUDE.md 這類專案的基本設定。優點是乾淨,不帶殘留的 context;代價是任務說明得把背景交代清楚。
fork 是主 agent 的分身,繼承主對話到目前為止的完整 context — 討論過什麼、決定了什麼、踩過哪些坑。不用重新交代,直接可以動工。
兩者都在自己的 context window 裡跑,跑完只把結論交回來。Day 10 提過,這是管理工作記憶的方法之一:過程中讀過的檔案、跑過的指令都留在分身那邊,主對話保持乾淨。
一般的 subagent 和 fork 之間不會互相開會。所有溝通都經過主 agent — 出發前的交代,回來後的整合。Brooks 的四十五條溝通線沒有出現,但這兩端的成本一點都沒少。
先看交代。subagent 的「進入狀況」就是那份任務說明。交代得太少,它會用預設判斷填空:要它找某個 bug 的根因,沒說已經排除了哪些可能,它就從頭再排除一次;要它改一支 API,沒說團隊慣例,它就照自己的習慣寫。結果看起來完整,其實有一半在重做已經做過的事。交代得太多,寫說明的時間又可能比自己動手還長。
fork 省掉了說明,但把整段 context 一起帶了過去。token 費用可以吃到 prompt cache 的折扣,context window 的空間卻實實在在被占掉。主對話已經很長的話,每個 fork 一出生就只剩不多的工作空間。
再看整合。三個分身回來三份結論,得有人讀完、比對、判斷哪份可信。如果它們改了同一批檔案,還要處理衝突。Claude Code 可以讓每個分身在獨立的 git worktree 裡工作,彼此不會互相覆蓋,但最後把改動合回來的工作仍然跑不掉。
適合分出去的工作,彼此獨立,結果可以各自驗證。同時查五個模組有沒有用到某個已棄用的 API;用五種角度 review 同一份文件;平行排除三個互不相干的 bug 來源。誰先做完都不影響別人,最後把結果合起來就好。
不適合分出去的工作,下一步取決於上一步的結果。debug 常常是這樣:第一個假設驗證完,才知道第二個假設該往哪找。假設之間有依賴時,同時派三個分身去試,後面兩個可能都建立在錯誤的前提上。
Anthropic 分享多 agent 研究系統時公開過一組數字:單一 agent 的 token 用量大約是一般對話的四倍,多 agent 系統大約是十五倍。換來的是在他們內部的研究評測上,多 agent 架構的表現比單一 agent 高出 90.2%。
平行化有效,但不便宜。值得付這個價錢的,是真的能拆、真的需要廣度的任務。為了一個十分鐘就能自己查完的問題派出五個分身,等於花錢買溝通成本。降低帳單的方法之一,是替簡單的任務指定比較便宜的模型 — Claude Code 的自訂 subagent 可以在設定裡寫明要用哪個模型、能用哪些工具。
先問能不能拆成彼此不依賴的幾塊,不能就自己做。
能拆的話,每一塊的結果要能單獨確認對錯,否則合起來時還是得全部重看一次。
最後估一下交代的成本。寫說明比自己做還久,要嘛改用 fork 省掉說明,要嘛乾脆自己來。
都過了再派出去。需要背景的用 fork,需要乾淨視角的用 subagent — 比如要人從零審一份文件,就別讓它先看到你怎麼想。
Brooks 在 1975 年寫的是人。他觀察到的限制跟人的能力無關,跟工作的結構有關:拆得開的工作才能平行,每多一個參與者就多一份對齊成本。
AI agent 把「加人」從幾個月壓到幾秒,看起來像是終於打破了 Brooks 定律。其實它只拿掉了招募和培訓。工作的結構沒有改變,對齊的成本從會議室搬進了任務說明和 token 帳單。
五十年前,專案經理要決定這件事值不值得多找一個人。現在要決定的是,這件事值不值得多開一個分身。
延伸閱讀
把 Brooks 定律搬過來這個類比很貼。補一個 subagent 和 fork 之間容易被忽略的面向:fork 繼承的不只是背景知識,還有主執行緒當下的假設——如果主線已經走偏,fork 會帶著同樣的錯誤前提繼續跑。所以我的分法是:要「延續進度」用 fork,要「驗證主線的產出」反而要用 subagent。乾淨的 context 在審查場景是功能不是缺陷:它不知道主線「本來就是這樣做的」,才抓得到假設本身的錯。
謝謝補充!fork 會連錯的前提一起繼承這點很重要,這個分法很實用。